package com.itheima.interface2;

public class Test1 {

    public static void main(String[] args) {

        //接口的几点注意事项：
        //1.接口与接口可以多继承，一个接口可以同时继承多个接口（重点）
        //2.一个接口继承多个接口时，如果多个接口中存在方法签名冲突，则此时不支持多继承，也不支持多实现（了解）
        //3.一个类继承了父类，又同时实现了接口，如果父类和接口中存在同名的方法，实现类会优先用父类中的方法
        //4.一个类实现了多个接口，如果多个接口中存在同名的默认方法，可以不冲突，这个类重写这个方法即可

        C2 c = new C2();
        c.show();
        c.go();
    }
}

//4.一个类实现了多个接口，如果多个接口中存在同名的默认方法，可以不冲突，这个类重写这个方法即可
interface A3 {
    default void show(){
        System.out.println("接口A3中的show方法");
    }
}

interface B3 {
    default void show(){
        System.out.println("接口B3中的show方法");
    }
}

class C3 implements A3, B3{
    public void show() {

        System.out.println("接口C3中的show方法");
        A3.super.show();
        B3.super.show();
    }
}

//3.一个类继承了父类，又同时实现了接口，如果父类和接口中存在同名的方法，实现类会优先用父类中的方法
interface A2 {
    default void show() {
        System.out.println("接口A2中的show方法");
    }
}

class B2 {
    public void show() {
        System.out.println("父类B2中的show方法");
    }
}

//注意：先写extends再写implements，否则会报错（父类->父亲，接口->干爹）
class C2 extends B2 implements A2 {

    //中转方法：偏门，不需要记
    public void go() {

        show();               //父类的show方法
        super.show();           //父类的show方法
        A2.super.show();          //接口的show方法
    }

}


//2.一个接口继承多个接口时，如果多个接口中存在方法签名冲突，则此时不支持多继承，也不支持多实现（了解）
interface A1 {
    //void show();
    String show();   //此时存在方法签名冲突，所以不支持多继承，也不支持多实现
}

interface B1 {
    void show();
}

/*interface C1 extends A1, B1{

}

class D1 implements A1, B1{
    @Override
    public void show() {

    }
}*/


//1.接口与接口可以多继承，一个接口可以同时继承多个接口（重点）
//类与类：单继承，一个类只能继承一个直接父类
//类与接口：多实现，一个类可以同时实现多个接口
//接口与接口：多继承，一个接口可以同时继承多个接口
interface A {
    //public abstract 可以省略
    public abstract void showA();
}

interface B {
    public abstract void showB();
}

interface C extends A, B {
    public abstract void showC();
}

class D implements C {

    @Override
    public void showC() {

    }

    @Override
    public void showA() {

    }

    @Override
    public void showB() {

    }
}